﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SOM.AbstractDAL;
using SOM.Model;
using SOM.SingletonContext;
using System.Data.Objects.DataClasses;

namespace SOM.ConcreteDAL
{
    public class ComentarioDAL : AbstractComentarioDAL
    {
        private SOMEntities _contexto;

        public ComentarioDAL()
        {
            _contexto = new SOMEntities();
        }

        /// <summary>
        /// Retorna todos os comentarios
        /// </summary>
        /// <returns></returns>
        public override List<Comentario> ReturnAll()
        {



            var consulta = from c in _contexto.ComentariosSet
                           select c;

            return consulta.ToList();

        }

        /// <summary>
        /// Retorna comentario pelo seu ID
        /// </summary>
        /// <param name="idComentario"></param>
        /// <returns></returns>
        public override Comentario FindById(int idComentario)
        {
            var consulta = from c in _contexto.ComentariosSet
                           where c.com_id_comentario.Equals(idComentario)
                           select c;

            return consulta.First();
        }

        public override Comentario Load(int idComentario, SOMEntities contexto)
        {
            var consulta = from c in contexto.ComentariosSet
                           where c.com_id_comentario.Equals(idComentario)
                           select c;

            return consulta.First();
        }

        /// <summary>
        /// Insere um comentario
        /// </summary>
        /// <param name="comentario"></param>
        public override void Insert(Comentario comentario)
        {
            using (SOMEntities _contexto = new SOMEntities())
            {
                _contexto.AddToComentariosSet(comentario);

                _contexto.SaveChanges();
            }
        }

        /// <summary>
        /// Remove um comentário
        /// </summary>
        /// <param name="comentario"></param>
        public override void Delete(Comentario comentario)
        {


            _contexto.DeleteObject(comentario);

            _contexto.SaveChanges();
        }

        /// <summary>
        /// Exclui uma lista de comentarios
        /// </summary>
        /// <param name="comentarioList"></param>
        public override void Delete(List<Comentario> comentarioList)
        {

            foreach (Comentario comentario in comentarioList)
            {
                _contexto.DeleteObject(comentario);
            }

            _contexto.SaveChanges();
        }

        public override void Delete(List<Comentario> comentariosList, SOMEntities contexto)
        {
            foreach (Comentario comentario in comentariosList)
            {
                contexto.DeleteObject(comentario);
            }

            contexto.SaveChanges();
        }

        public override void Delete(Comentario comentario, SOMEntities contexto)
        {
            contexto.DeleteObject(comentario);
            contexto.SaveChanges();
        }

        public override void SaveChanges()
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Retorna uma lista de comentários através de uma reclamação
        /// </summary>
        /// <param name="reclamacao"></param>
        /// <returns></returns>
        public override List<Comentario> FindByReclamacao(Reclamacao reclamacao)
        {

            var consulta = from com in _contexto.ComentariosSet
                           where com.rec_reclamacao.rec_id_reclamacao.Equals(reclamacao.rec_id_reclamacao)
                           select com;

            return consulta.Count() == 0 ? null : consulta.ToList();
        }
    }
}
